package br.com.weaverwebsite.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.SqlParameterValue;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Component;

import br.com.weaverwebsite.dao.UsuarioDAO;
import br.com.weaverwebsite.model.UsuarioEntity;

@Component
public class UsuarioDAOJdbc implements UsuarioDAO {

	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	private String insertSql = "	" +
								" INSERT INTO " +
								" tbl_usuario " +
								" (nome_usuario,senha_usuario,email_usuario,perfil_usuario) " +
								" VALUES " +
								" (?,?,?,?) ";
	
	private String updateSql = "	" +
								" UPDATE " +
								" tbl_usuario " +
								" SET " +
								" nome_usuario = ?, senha_usuario = ?, email_usuario = ?, perfil_usuario = ? ";
	
	private String deleteSql = "	" +
								" DELETE " +
								" FROM " +
								" tbl_usuario ";
	
	private String selectSql = "	" +
								" SELECT " +
								" id_usuario,nome_usuario,senha_usuario,email_usuario,perfil_usuario "+
								" FROM " +
								" tbl_usuario ";

	
	
	
	@Override
	public Integer inserirUsuario(UsuarioEntity usuario) throws Exception {
		
		String sql = insertSql;		
		KeyHolder keyHolder = new GeneratedKeyHolder();
		
		jdbcTemplate.update(new UsuarioPreparedStatement(usuario, sql), keyHolder);
		
		return keyHolder.getKey().intValue();
	}
	
	

	@Override
	public Integer alterarUsuario(UsuarioEntity usuario) throws Exception {
	
		String sql = updateSql;
			   sql += " WHERE " +
			   		  " id_usuario = ? ";
			   
		SqlParameterValue paramId = new SqlParameterValue(Types.INTEGER, usuario.getIdUsuario());
		SqlParameterValue paramNome = new SqlParameterValue(Types.VARCHAR, usuario.getNomeUsuario());
		SqlParameterValue paramSenha = new SqlParameterValue(Types.VARCHAR, usuario.getSenhaUsuario());
		SqlParameterValue paramEmail = new SqlParameterValue(Types.VARCHAR, usuario.getEmailUsuario());
		SqlParameterValue paramPerfil = new SqlParameterValue(Types.INTEGER, usuario.getPerfilUsuario().getIdPerfil());
		
		Object[] param = new Object[]{ paramId, paramNome, paramSenha, paramEmail, paramPerfil};
		
		return jdbcTemplate.update(sql, param);
	}

	@Override
	public Integer removerUsuario(Integer idUsuario) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public UsuarioEntity selecionarUsuario(Integer idUsuario) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<UsuarioEntity> selecionarTodosUsuarios() throws Exception {
		// TODO Auto-generated method stub
		return null;
	}
	
	
	private static final class UsuarioPreparedStatement extends UsuarioDAOJdbc implements PreparedStatementCreator{

		String sql = null;
		UsuarioEntity usuario = null;
		
		public UsuarioPreparedStatement(UsuarioEntity usuario, String sql) {
			this.usuario = usuario;
			this.sql = sql;
		}
		
		
		public PreparedStatement createPreparedStatement(Connection conn)
				throws SQLException {
			
			PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			
			ps.setString(1, usuario.getNomeUsuario());
			ps.setString(2, usuario.getSenhaUsuario());
			ps.setString(3, usuario.getEmailUsuario());
			ps.setInt(4, usuario.getPerfilUsuario().getIdPerfil() != null ? usuario.getPerfilUsuario().getIdPerfil() : 0);
			
			return ps;
		}
		
	}
	

}
